#include "sqlist.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>

//创建一个顺序表
sqlink list_create(){
	//强制类型转化
	sqlink l =(sqlink) malloc(sizeof(sqlist));
	if( l == NULL){
		printf("list create failed\n");
	}
	//堆上内存值是不确定的，申请完后，存入默认值0
	//用一个固定的常量填充内存
	memset(l, 0, sizeof(sqlist));
	l->last = -1;
	return l;
}
//重置一个顺序表
void list_clear(sqlink l){
	if(l == NULL){
		printf("sqlink is null\n");
	}
	memset(l, 0, sizeof(sqlist));
	l->last = -1;
}
//释放顺序表的所有内存
void list_free(sqlink l){
	if(l == NULL){
		printf("sqlink is null\n");
	}
	free(l);
}
//顺序表是否为空
bool list_empty(sqlink l){
	if(l == NULL){
		printf("sqlink is null\n");
	}
	if(l->last == -1){
		return true;
	}else{
		return false;
	}
}
//顺序表的长度是多少
int list_length(sqlink l){	
	if(l == NULL){
		printf("sqlink is null\n");
	}
	return l->last+1;
}
//给一个值，定位该值在顺序表中的位置
int list_locate(sqlink l, data_t value){
	if(l == NULL){
		printf("sqlink is null\n");
	}
	int i = 0;
	while(i <= l->last){
		if(value == l->data[i]){
			return i;
		}
		i++;
	}
	return -1;
}
//往顺序表的指定位置插入某个值
bool list_insert(sqlink l, data_t value, int pos){
	//1. 检查是否还有位置
	if(l->last == N-1){
		printf("sqlist is full\n");
		return false;
	}
	//2.检查pos参数是否合法
	if(pos < 0 || pos > l->last+1){
		printf("pos is invalid\n");
		return false;
	}
	//3.元素向后复制一位
	int i = l->last;
	while(i >= pos){
		l->data[i+1] = l->data[i];
		i--;
	}
	//4.赋值
	//写成pos更好理解
	l->data[pos] = value;
	l->last++;
	return true;
}
//删除顺序表里指定位置的值
bool list_delete(sqlink l, int pos){
	//1.检查pos参数是否合法
	if(pos < 0 || pos > l->last){
		printf("pos is invalid\n");
		return false;
	}
	//2.元素向前复制一位
	int i = pos;
	while(i < l->last){
		l->data[i] = l->data[i+1];
		i++;
	}
	l->last--;
	return true;
}
//合并两个顺序表，L2不改变，L1新增放入L2里L1没有的值
void list_merge(sqlink l1, sqlink l2){
	/*
	int i = 0;
	while( i <= l2->last){
		data_t temp = l2->data[i];
		int j = 0;
		while(j <= l1->last){
			if(l1->data[j] == temp){
				break;
			}else{
				j++;
			}
		}
		if(j > l1->last){
			l1->data[j] = temp;
			l1->last++;
		}
		i++;
	}
	*/
	//可以进一步优化,分逻辑去写：
	//先定位有没有，在没有的情况下再去指定位置插入
	int i = 0;
	int ret;
	while(i <= l2->last){
		ret = list_locate(l1, l2->data[i]);
		if(ret == -1){
			if(!list_insert(l1, l2->data[i], l1->last+1)){
				printf("merge failed\n");
			}
		}
		i++;
	}
}
//删除顺序表里重复的元素
void list_purge(sqlink l){
	if(l == NULL){
		printf("l is Null\n");
	}
	if(l->last == -1 || l->last == 0){
		return;
	}
	int i = 1;
	while(i <= l->last){
		int j = 0;
		while(j < i){
			if(l->data[j] == l->data[i]){
				list_delete(l, j);
				break;
			}else{
				j++;
			}
		}
		if(j == i){
			i++;
		}
	}

}
//打印顺序表的信息
void list_show(sqlink l){
	if(l == NULL){
		printf("l is Null\n");
	}
	if(l->last == -1){
		printf("sqlist is empty\n");
		return ;
	}
	int i = 0;
	while(i <= l->last){
		printf("%d ",l->data[i]);
		i++;
	}
	printf("\n");
}
